suppressPackageStartupMessages({
  library("here")
  library("tidyverse")
  library("MplusAutomation")
  library("gt")
  library("glue")
  library("kableExtra")
  library("misty")
  library("lavaan")
  library("AICcmodavg")
  library("nonnest2")
  library("DiagrammeR")
  library("lavaan")
  library("tidyLPA")
  library("semTools")
  library("brms")
  library("MBESS")
  library("ufs")
  library("robmed")
  library("careless")
  library("mice")
  library("psych")
  library("BayesFactor")
  library("effectsize")
  library("tidybayes")
  library("emmeans")
  library("bayesplot")
  library("patchwork")
  library("bmlm")
})

# install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))


options("max.print" = .Machine$integer.max)

# Make random things reproducible
set.seed(1234)

options(mc.cores = 4)

bayesplot_theme_set()
source(here::here("src", "functions", "funs_add_neoffi60_subscales.R"))
source(here::here("src", "functions", "funs_correct_iesr_scores.R"))
source(here::here("src", "functions", "funs_plot_job_qualification.R"))
source(here::here("src", "functions", "funs_generate_all_items_df.R"))

scale_this <- function(x) as.vector(scale(x))

sum_coding <- function(x, lvls = levels(x)) {
  # codes the first category with -1
  nlvls <- length(lvls)
  stopifnot(nlvls > 1)
  cont <- diag(nlvls)[, -nlvls, drop = FALSE]
  cont[nlvls, ] <- -1
  cont <- cont[c(nlvls, 1:(nlvls - 1)), , drop = FALSE]
  colnames(cont) <- lvls[-1]
  x <- factor(x, levels = lvls)
  contrasts(x) <- cont
  x
}

Get data

all_items <- generate_all_items_df()

There is a problem with IES-R, in the control group. I shift the control distribution of IES-R towards lower values.

```r
temp <- correct_iesr_scores(all_items)
all_items <- temp

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGFsbF9pdGVtcywgYWVzKHggPSBpZXNyX3RzLCBjb2xvdXIgPSBpc19yZXNjdWVfd29ya2VyKSkgK1xuICBnZW9tX2RlbnNpdHkoKVxuYGBgIn0= -->

```r
ggplot(all_items, aes(x = iesr_ts, colour = is_rescue_worker)) +
  geom_density()

all_items |> 
  ggplot(aes(y=iesr_ts, fill=is_rescue_worker)) + 
    geom_boxplot() +
    scale_y_log10()

all_items$y <- all_items$iesr_ts + 0.001

all_items |> 
  group_by(is_rescue_worker) |> 
  summarize(
    # gm_iesr = geometric.mean(y, na.rm = TRUE),
    avg_iesr = mean(y, na.rm = TRUE)
  )

There are some cases in which the RWs of Toscana and Lombardia did not have the proper qualification. They are assigned to the category of RWs.

all_items$idx <- 1:nrow(all_items)
all_items$is_rescue_worker <- as.character(all_items$is_rescue_worker)
all_items$is_rescue_worker <- ifelse(
  all_items$idx < 746, "Si", all_items$is_rescue_worker
)
all_items$idx <- NULL
all_items$commeetee_location <- ifelse(
  all_items$is_rescue_worker == "No", "None", all_items$red_cross_commeetee_location
) |> 
  factor()
all_items$commeetee_location <- ifelse(
  all_items$is_rescue_worker == "No" & all_items$age < 25, "students", all_items$commeetee_location
)
all_items$commeetee <- ifelse(
  all_items$is_rescue_worker == "No" & all_items$age >= 25, "community_sample",
  all_items$commeetee_location
)

all_items$commeetee <- 
  ifelse(is.na(all_items$commeetee), "community_sample", all_items$commeetee) |> 
  factor()

sum(is.na(all_items$commeetee))
[1] 0
```r
```r
```r
# all_items <- all_items %>%
#   mutate(job_qualification = case_when(
#     is_rescue_worker==\Si\ & job_qualification == \non_rescue_worker\ ~ \team_member\,
#     TRUE ~ job_qualification)) 

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## IES-R as a function of group

iesr_ts | trunc(lb = 0) ~ is_rescue_worker + (1 | commeetee),


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubTAgPC0gYnJtKFxuICBiZihpZXNyX3RzIH4gaXNfcmVzY3VlX3dvcmtlciksXG4gIGZhbWlseSA9IGh1cmRsZV9nYW1tYSgpLFxuICBkYXRhID0gYWxsX2l0ZW1zLFxuICBiYWNrZW5kID0gXCJjbWRzdGFuclwiXG4gICMgYWxnb3JpdGhtID0gXCJtZWFuZmllbGRcIlxuKVxuYGBgIn0= -->

```r
m0 <- brm(
  bf(iesr_ts ~ is_rescue_worker),
  family = hurdle_gamma(),
  data = all_items,
  backend = "cmdstanr"
  # algorithm = "meanfield"
)
pp_check(m0)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

summary(m0)
 Family: hurdle_gamma 
  Links: mu = log; shape = identity; hu = identity 
Formula: iesr_ts ~ is_rescue_worker 
   Data: all_items (Number of observations: 1068) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept              2.69      0.05     2.60     2.79 1.00     4431     2990
is_rescue_workerSi     0.26      0.06     0.15     0.37 1.00     4401     3236

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
shape     1.41      0.06     1.30     1.52 1.00     4553     2820
hu        0.05      0.01     0.04     0.06 1.00     4772     3170

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m0, "is_rescue_worker"
)
plot(me, points = FALSE)

BFt <- BayesFactor::ttestBF(
  all_items$ies_ts[all_items$is_rescue_worker == "Si"], 
  all_items$ies_ts[all_items$is_rescue_worker == "No"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |       95% CI
------------------------
0.28      | [0.15, 0.41]

- Estimated using pooled SD.

Supported families are: ‘acat’, ‘asym_laplace’, ‘bernoulli’, ‘beta’, ‘beta_binomial’, ‘binomial’, ‘categorical’, ‘com_poisson’, ‘cox’, ‘cratio’, ‘cumulative’, ‘custom’, ‘dirichlet’, ‘dirichlet2’, ‘discrete_weibull’, ‘exgaussian’, ‘exponential’, ‘frechet’, ‘gamma’, ‘gaussian’, ‘gen_extreme_value’, ‘geometric’, ‘hurdle_cumulative’, ‘hurdle_gamma’, ‘hurdle_lognormal’, ‘hurdle_negbinomial’, ‘hurdle_poisson’, ‘info’, ‘inverse.gaussian’, ‘logistic_normal’, ‘lognormal’, ‘multinomial’, ‘negbinomial’, ‘negbinomial2’, ‘poisson’, ‘shifted_lognormal’, ‘skew_normal’, ‘sratio’, ‘student’, ‘von_mises’, ‘weibull’, ‘wiener’, ‘zero_inflated_asym_laplace’, ‘zero_inflated_beta’, ‘zero_inflated_beta_binomial’, ‘zero_inflated_binomial’, ‘zero_inflated_negbinomial’, ‘zero_inflated_poisson’, ‘zero_one_inflated_beta’

The sk, ch, mi sub-scales are coded so that high values indicate high self-compassion levels. The sj, is, oi sub-scales are coded so that high values indicate low self-compassion levels.

The ts_sc score has been computed by reversing the coding of the items of the sj, is, oi sub-scales (so that they indicate the absence of self-judgment, absence of isolation, absence of over-identification).

scs_subscales <- with(all_items, data.frame(sk, ch, mi, sj, is, oi, scs_ts))
cor(scs_subscales) |> round(2)
          sk    ch    mi    sj    is    oi scs_ts
sk      1.00  0.52  0.58 -0.39 -0.28 -0.24   0.71
ch      0.52  1.00  0.49 -0.01 -0.03 -0.04   0.45
mi      0.58  0.49  1.00 -0.19 -0.33 -0.35   0.66
sj     -0.39 -0.01 -0.19  1.00  0.67  0.66  -0.75
is     -0.28 -0.03 -0.33  0.67  1.00  0.80  -0.78
oi     -0.24 -0.04 -0.35  0.66  0.80  1.00  -0.78
scs_ts  0.71  0.45  0.66 -0.75 -0.78 -0.78   1.00

COPE scale

In the COPE scale only two factors are identified.

all_items$pos_reinterpretation <- with(all_items, cope_1 + cope_29 + cope_38 + cope_59)
all_items$mental_disengagement <- with(all_items, cope_2 + cope_16 + cope_31 + cope_43) 
all_items$venting <- with(all_items, cope_3 + cope_17 + cope_28 + cope_46) 
all_items$seeking_instrumental_support <- with(all_items, cope_4 + cope_14 + cope_30 + cope_45) 
all_items$active_coping <- with(all_items, cope_5 + cope_25 + cope_47 + cope_58)  
all_items$denial <- with(all_items, cope_6 + cope_27 + cope_40 + cope_57) 
all_items$religion <- with(all_items, cope_7 + cope_18 + cope_48 + cope_60) 
all_items$humor <- with(all_items, cope_8 + cope_20 + cope_36 + cope_50) 
all_items$behavioral_disengagement <- with(all_items, cope_9 + cope_24 + cope_37 + cope_51) 
all_items$restraint <- with(all_items, cope_10 + cope_22 + cope_41 + cope_49) 
all_items$seeking_emotional_support <- with(all_items, cope_11 + cope_23 + cope_34 + cope_52) 
all_items$substance_use <- with(all_items, cope_12 + cope_26 + cope_35 + cope_53) 
all_items$acceptance <- with(all_items, cope_13 + cope_21 + cope_44 + cope_54) 
all_items$suppr_competing_activities <- with(all_items, cope_15 + cope_33 + cope_42 + cope_55) 
all_items$planning <- with(all_items, cope_19 + cope_32 + cope_39 + cope_56) 

Create COPE sub-scales scores using all items – note that SEM analyses suggest to drop some of the items.

all_items$active_coping <- with(
  all_items, pos_reinterpretation + active_coping +
  suppr_competing_activities + planning + restraint + 
    seeking_instrumental_support + acceptance
)

all_items$avoidance_coping <- with(
  all_items, mental_disengagement + denial + humor +
  behavioral_disengagement + substance_use + religion 
)

all_items$soc_emo_coping <- with(
  all_items, seeking_instrumental_support +
  seeking_emotional_support + venting
)

Self-compassion scale

plot(density(all_items$scs_ts))

fit_1 <- brm(
  bf(
    scs_ts ~ is_rescue_worker,
    sigma ~ is_rescue_worker
    ),
  family = student(),
  backend = "cmdstanr",
  data = all_items
)
pp_check(fit_1)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

me <- conditional_effects(
  fit_1, "is_rescue_worker"
)
plot(me, points = FALSE)

summary(fit_1)
 Family: student 
  Links: mu = identity; sigma = log; nu = identity 
Formula: scs_ts ~ is_rescue_worker 
         sigma ~ is_rescue_worker
   Data: all_items (Number of observations: 1068) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept                   74.11      1.02    72.15    76.10 1.00     3862     2674
sigma_Intercept              2.88      0.04     2.80     2.97 1.00     4140     2724
is_rescue_workerSi           7.49      1.19     5.17     9.78 1.00     4050     2963
sigma_is_rescue_workerSi    -0.13      0.05    -0.23    -0.03 1.00     4027     2960

Family Specific Parameters: 
   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
nu    38.40     15.75    16.97    77.94 1.00     4228     3115

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
BFt <- BayesFactor::ttestBF(
  all_items$scs_ts[all_items$is_rescue_worker == "Si"], 
  all_items$scs_ts[all_items$is_rescue_worker == "No"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |       95% CI
------------------------
0.42      | [0.29, 0.56]

- Estimated using pooled SD.
rw_df <- all_items |> 
  dplyr::filter(is_rescue_worker == "Si")

rw_df <- rw_df %>%
  mutate(job_qualification = case_when(
    job_qualification == "non_rescue_worker" ~ "team_member",
    TRUE ~ job_qualification))

LPA

lpa_scales <- c(
  "is_rescue_worker",
  "neuroticism", "extraversion", "openness", "agreeableness", "conscientiousness",
  "active_coping", "avoidance_coping", "soc_emo_coping",
  "iesr_ts",
  # "avoiding", "intrusivity", "hyperarousal",
  # "sk", "ch", "mi", "sj", "is", "oi",
  # "pos_sc",
  # "neg_sc",
  # "ts_sc",
  "mpss_tot"
  # "ptgi_total_score"
  # "relating_to_others",
  # "new_possibilities",
  # "personal_strength",
  # "appreciation_of_life",
  # "spirituality"
)

lpa_rw_df <- subset(rw_df, select=lpa_scales) 

# lpa_rw_df <- subset(all_items, select=lpa_scales) |> 
#   dplyr::filter(is_rescue_worker == "Si")

lpa_rw_df$is_rescue_worker <- NULL

head(lpa_rw_df)
lpa_rw_df %>% 
  scale() %>%
  estimate_profiles(1:6,
    variances = c("equal", "varying"),
    covariances = c("zero", "varying")
    #package = "MplusAutomation"
  )
tidyLPA analysis using mclust: 

 Model Classes AIC      BIC      Entropy prob_min prob_max n_min n_max BLRT_p
 1     1       21342.45 21434.88 1.00    1.00     1.00     1.00  1.00        
 1     2       20740.50 20883.76 0.71    0.87     0.94     0.36  0.64  0.01  
 1     3       20459.15 20653.25 0.75    0.82     0.93     0.18  0.57  0.01  
 1     4       20314.46 20559.39 0.72    0.84     0.84     0.11  0.41  0.01  
 1     5       20232.20 20527.97 0.71    0.78     0.84     0.09  0.32  0.01  
 1     6       20161.53 20508.13 0.74    0.72     0.89     0.05  0.32  0.01  
 6     1       19882.54 20182.93 1.00    1.00     1.00     1.00  1.00        
 6     2       19509.14 20114.55 0.70    0.89     0.94     0.44  0.56  0.01  
 6     3       19415.46 20325.88 0.73    0.87     0.90     0.26  0.38  0.01  
 6     4       19396.37 20611.80 0.72    0.82     0.89     0.23  0.29  0.19  
 6     5       19359.41 20879.85 0.77    0.84     0.90     0.10  0.28  0.07  
 6     6       19321.00 21146.46 0.81    0.81     0.99     0.08  0.23  0.04  
lpa_rw_df %>% 
  scale() %>%
  estimate_profiles(1:6,
    variances = c("equal", "varying"),
    covariances = c("zero", "varying")
    # package = "MplusAutomation"
  ) %>% 
  compare_solutions(statistics = c("AIC", "BIC"))
m2 <- lpa_rw_df %>%
  scale() %>%
  estimate_profiles(2,
    variances = "varying",
    covariances = "varying",
    package = "MplusAutomation"
  )
m2_plot <- lpa_rw_df %>%
  scale() %>%
  estimate_profiles(2,
    variances = "varying",
    covariances = "varying",
    package = "MplusAutomation"
    ) %>%
    plot_profiles(add_line = TRUE, rawdata= FALSE, bw = FALSE)

Profile 2: dysfunctional Profile 1: adaptive

get_estimates(m2)
out <- get_data(m2)
lpa_rw_df$lpa_class <- out$Class
table(
  lpa_rw_df$lpa_class
)

  1   2 
409 342 
table(
  lpa_rw_df$lpa_class, rw_df$job_qualification
)
   
    driver team_leader team_member
  1     96         161         152
  2     59         138         145
lpa_rw_df$class <- factor(lpa_rw_df$lpa_class)
summary(lpa_rw_df$class)
  1   2 
409 342 
rw_df$class <- lpa_rw_df$class
rw_df$profile <- lpa_rw_df$class
rw_df$profile <- ifelse(
  rw_df$profile == "2", "maladaptive", "adaptive"
)
rw_df$profile <- factor(rw_df$profile)
# Reorder the levels of the 'profile' factor
rw_df$profile <- factor(rw_df$profile, levels = c("maladaptive", "adaptive"))
m1 <- brm(
  bf(scs_ts ~ profile),
  family = skew_normal(),
  data = rw_df,
  init = 0.1,
  backend = "cmdstanr",
  adapt_delta = 0.9
)
pp_check(m1)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

summary(m1)
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: scs_ts ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          74.55      0.83    72.90    76.14 1.00     3443     2621
profileadaptive    12.64      1.15    10.39    14.92 1.00     3493     2699

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma    14.90      0.38    14.19    15.68 1.00     4123     2947
alpha    -0.70      0.59    -1.53     0.58 1.00     2187     3498

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m1, "profile"
)
plot(me, points = FALSE)

BFt <- BayesFactor::ttestBF(
  rw_df$scs_ts[rw_df$class == 1], 
  rw_df$scs_ts[rw_df$class == 2],
  paired = FALSE
)
effectsize(BFt, type = "d")
Cohen's d |       95% CI
------------------------
0.87      | [0.71, 1.02]

- Estimated using pooled SD.
m1 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  # facet_grid(~ wool) +
  # theme_light()
  labs(x = "LPA Class", y = "SCS Score", title = "Rescue Workers") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 83, label = "Bayesian Cohen's d = 0.89\n 95% CI [0.73, 1.04]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").

names(all_items)

Self-judgment

m2 <- brm(
  bf(sj ~ profile),
  data = rw_df,
  family = student,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m2)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m2 <- loo(m2)
plot(loo_m2)

summary(m2)
 Family: student 
  Links: mu = identity; sigma = identity; nu = identity 
Formula: sj ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          17.03      0.23    16.58    17.48 1.00     3615     2904
profileadaptive    -3.61      0.31    -4.20    -2.99 1.00     3754     2741

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     4.27      0.12     4.04     4.52 1.00     2939     2589
nu       46.35     16.93    21.54    86.78 1.00     3388     2924

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m2, "profile"
)
plot(me, points = FALSE)

emmeans(m2, specs = pairwise ~ profile)
$emmeans
 profile     emmean lower.HPD upper.HPD
 maladaptive   17.0      16.6      17.5
 adaptive      13.4      13.0      13.8

Point estimate displayed: median 
HPD interval probability: 0.95 

$contrasts
 contrast               estimate lower.HPD upper.HPD
 maladaptive - adaptive     3.61      3.01      4.21

Point estimate displayed: median 
HPD interval probability: 0.95 
BFt <- BayesFactor::ttestBF(
  rw_df$sj[rw_df$profile == "adaptive"], 
  rw_df$sj[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |         95% CI
--------------------------
-0.81     | [-0.97, -0.66]

- Estimated using pooled SD.
p2 <- m2 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  # facet_grid(~ wool) +
  # theme_light()
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Self-Judgment", title = "A") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 14.5, label = "Bayesian Cohen's d = 0.82\n 95% CI [0.67, 0.97]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p2

Isolation

m3 <- brm(
  bf(is ~ profile),
  family = skew_normal(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.95
)
pp_check(m3)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m3 <- loo(m3)
plot(loo_m3)

summary(m3)
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: is ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          12.29      0.25    11.78    12.80 1.00     2470     2490
profileadaptive    -3.38      0.34    -4.05    -2.69 1.00     2358     2099

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     4.06      0.12     3.84     4.32 1.00     2494     2593
alpha     2.31      0.65     1.13     3.65 1.00     1915     2113

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m3, "profile"
)
plot(me, points = FALSE)

emmeans(m3, specs = pairwise ~ profile)
$emmeans
 profile     emmean lower.HPD upper.HPD
 maladaptive  12.29     11.80     12.81
 adaptive      8.91      8.49      9.28

Point estimate displayed: median 
HPD interval probability: 0.95 

$contrasts
 contrast               estimate lower.HPD upper.HPD
 maladaptive - adaptive     3.38      2.74      4.09

Point estimate displayed: median 
HPD interval probability: 0.95 
BFt <- BayesFactor::ttestBF(
  rw_df$is[rw_df$profile == "adaptive"], 
  rw_df$is[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |         95% CI
--------------------------
-0.93     | [-1.08, -0.78]

- Estimated using pooled SD.
p3 <- m3 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Isolation", title = "B") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 10.2, label = "Bayesian Cohen's d = 0.94\n 95% CI [0.79, 1.10]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p3

Over-identification

m4 <- brm(
  bf(oi ~ profile),
  family = skew_normal(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m4)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m4 <- loo(m4)
plot(loo_m4)

summary(m4)
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: oi ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          10.96      0.24    10.48    11.42 1.00     1492     1549
profileadaptive    -2.51      0.34    -3.16    -1.85 1.00     1366     1537

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     3.67      0.12     3.44     3.92 1.00     1369     1758
alpha     3.59      0.95     2.16     5.73 1.00     1253     1261

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m4, "profile"
)
plot(me, points = FALSE)

emmeans(m4, specs = pairwise ~ profile)
$emmeans
 profile     emmean lower.HPD upper.HPD
 maladaptive  10.97     10.48     11.42
 adaptive      8.44      8.04      8.79

Point estimate displayed: median 
HPD interval probability: 0.95 

$contrasts
 contrast               estimate lower.HPD upper.HPD
 maladaptive - adaptive     2.52      1.86      3.16

Point estimate displayed: median 
HPD interval probability: 0.95 
BFt <- BayesFactor::ttestBF(
  rw_df$oi[rw_df$profile == "adaptive"], 
  rw_df$oi[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |         95% CI
--------------------------
-0.96     | [-1.11, -0.81]

- Estimated using pooled SD.
p4 <- m4 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Over-Identification", title = "C") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 9.4, label = "Bayesian Cohen's d = 0.97\n 95% CI [0.82, 1.12]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p4

Self-kindness

m5 <- brm(
  bf(sk ~ profile),
  family = student(),
  data = rw_df,
  backend = "cmdstanr"
)
pp_check(m5)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m5 <- loo(m5)
plot(loo_m5)

summary(m5)
 Family: student 
  Links: mu = identity; sigma = identity; nu = identity 
Formula: sk ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          13.05      0.23    12.60    13.52 1.00     3991     3028
profileadaptive     1.25      0.31     0.63     1.86 1.00     4251     2936

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     4.21      0.12     3.98     4.45 1.00     3510     2614
nu       41.31     16.98    17.09    83.01 1.00     3245     2884

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m5, "profile"
)
plot(me, points = FALSE)

emmeans(m5, specs = pairwise ~ profile)
$emmeans
 profile     emmean lower.HPD upper.HPD
 maladaptive   13.1      12.6      13.5
 adaptive      14.3      13.9      14.7

Point estimate displayed: median 
HPD interval probability: 0.95 

$contrasts
 contrast               estimate lower.HPD upper.HPD
 maladaptive - adaptive    -1.26     -1.85    -0.625

Point estimate displayed: median 
HPD interval probability: 0.95 
BFt <- BayesFactor::ttestBF(
  rw_df$sk[rw_df$profile == "adaptive"], 
  rw_df$sk[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |       95% CI
------------------------
0.28      | [0.13, 0.42]

- Estimated using pooled SD.
p5 <- m5 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Self-Kindness", title = "D") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 14.5, label = "Bayesian Cohen's d = 0.28\n 95% CI [0.14, 0.43]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p5

Common humanity

m6 <- brm(
  bf(ch ~ profile),
  family = student(),
  data = rw_df,
  backend = "cmdstanr"
)
pp_check(m6)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m6 <- loo(m6)
plot(loo_m6)

summary(m6)
 Family: student 
  Links: mu = identity; sigma = identity; nu = identity 
Formula: ch ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          11.59      0.18    11.23    11.96 1.00     4291     3143
profileadaptive     0.01      0.24    -0.47     0.48 1.00     4425     3056

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     3.28      0.09     3.10     3.46 1.00     4625     2797
nu       43.03     16.67    19.04    83.45 1.00     4370     3134

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
me <- conditional_effects(
  m6, "profile"
)
plot(me, points = FALSE)

BFt <- BayesFactor::ttestBF(
  rw_df$ch[rw_df$profile == "adaptive"], 
  rw_df$ch[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |        95% CI
-------------------------
-5.07e-04 | [-0.14, 0.14]

- Estimated using pooled SD.
p6 <- m6 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Common-Humanity", title = "E") +
  papaja::theme_apa() + 
  annotate("text", x = 1.5, y = 12.2, label = "Bayesian Cohen's d = 0.00\n 95% CI [-0.14, 0.14]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p6

Mindfulness

m7 <- brm(
  bf(mi ~ profile),
  family = student(),
  data = rw_df,
  backend = "cmdstanr"
)
Compiling Stan program...

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

-

\

|

/

 
Start sampling
Chain 1 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 1 Exception: student_t_lpdf: Scale parameter is inf, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 75, column 4 to column 48)
Chain 1 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 1 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 1 
Chain 1 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 1 Exception: student_t_lpdf: Scale parameter is inf, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 75, column 4 to column 48)
Chain 1 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 1 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 1 
Chain 2 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 2 Exception: gamma_lpdf: Random variable is inf, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 67, column 2 to column 66)
Chain 2 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 2 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 2 
Chain 2 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 2 Exception: student_t_lpdf: Scale parameter is 0, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 75, column 4 to column 48)
Chain 2 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 2 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 2 
Chain 3 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 3 Exception: gamma_lpdf: Random variable is inf, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 67, column 2 to column 66)
Chain 3 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 3 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 3 
Chain 3 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 3 Exception: student_t_lpdf: Scale parameter is 0, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 75, column 4 to column 48)
Chain 3 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 3 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 3 
Chain 4 Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:
Chain 4 Exception: gamma_lpdf: Random variable is inf, but must be positive finite! (in '/var/folders/cy/4xdvhqx966nggmk95hsnyzc40000gn/T/RtmpFKK0iZ/model-9ac975dd8c9f.stan', line 67, column 2 to column 66)
Chain 4 If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,
Chain 4 but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.
Chain 4 
pp_check(m7)
Using 10 posterior draws for ppc type 'dens_overlay' by default.

loo_m7 <- loo(m7)
plot(loo_m7)

summary(m7)
 Family: student 
  Links: mu = identity; sigma = identity; nu = identity 
Formula: mi ~ profile 
   Data: rw_df (Number of observations: 751) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Population-Level Effects: 
                Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          12.74      0.17    12.41    13.08 1.01     3843     2838
profileadaptive     1.01      0.23     0.58     1.46 1.00     3804     2789

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     3.03      0.09     2.86     3.21 1.00     3965     2848
nu       36.26     15.13    15.29    72.29 1.00     3682     3429

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
emmeans(m7, specs = pairwise ~ profile)
$emmeans
 profile     emmean lower.HPD upper.HPD
 maladaptive   12.7      12.4      13.1
 adaptive      13.8      13.5      14.1

Point estimate displayed: median 
HPD interval probability: 0.95 

$contrasts
 contrast               estimate lower.HPD upper.HPD
 maladaptive - adaptive    -1.01     -1.44    -0.557

Point estimate displayed: median 
HPD interval probability: 0.95 
BFt <- BayesFactor::ttestBF(
  rw_df$mi[rw_df$profile == "adaptive"], 
  rw_df$mi[rw_df$profile == "maladaptive"],
  paired = FALSE
)
effectsize(BFt)
Cohen's d |       95% CI
------------------------
0.32      | [0.18, 0.46]

- Estimated using pooled SD.
me <- conditional_effects(
  m7, "profile"
)
plot(me, points = FALSE)

p7 <- m7 %>%
  emmeans( ~ profile) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = profile, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "SCS Mindfulness", title = "F") +
  papaja::theme_apa() + 
  annotate("text", x = 1, y = 13.8, label = "Bayesian Cohen's d = 0.32\n 95% CI [0.17, 0.46]")
Warning: 'geom_eye' is deprecated.
Use 'stat_eye' instead.
See help("Deprecated") and help("tidybayes-deprecated").
p7

fig_scs <- (p2 | p3 | p4) /
(p5 | p6 | p7)

out <- fig_scs + plot_annotation(
  title = 'SCS Subscales as a Function of LPA Profile'
  # subtitle = 'Rescue Workers group'
  # caption = 'Disclaimer: None of these plots are insightful'
)
ggsave("scs_subscales_lpa.pdf", width = 35, height = 20, units = "cm")
print(out)

IES-R

m10 <- brm(
  bf(ies_ts ~ class),
  family = skew_normal(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m10)
summary(m10)
p10 <- m10 %>%
  emmeans( ~ class) %>%
  gather_emmeans_draws() %>%
  ggplot(aes(x = class, y = .value)) +
  geom_eye() +
  stat_summary(aes(group = NA), fun.y = mean, geom = "line") +
  # facet_grid(~ wool) +
  # theme_light()
  scale_x_discrete(labels=c('Low Resilience', 'High Resilience')) +
  labs(x = "LPA Class", y = "Impact of Event Scale - Revised (IES-R)") +
  # papaja::theme_apa() + 
  annotate("text", x = 1, y = 17, label = "Bayesian Cohen's d = 1.34\n 95% CI [1.18, 1.50]")
p10
BFt <- BayesFactor::ttestBF(
  rw_df$ies_ts[rw_df$class == 1], 
  rw_df$ies_ts[rw_df$class == 2],
  paired = FALSE
)
effectsize(BFt)
emmeans(m10 , specs = pairwise ~ class)
m11 <- brm(
  bf(ptgi_total_score | trunc(lb = 0) ~ class),
  family = student(),
  data = rw_df,
  backend = "cmdstanr"
)
pp_check(m11)
summary(m11)

Job qualification

rw_df$job_qualification <- ifelse(
  rw_df$job_qualification == "non_rescue_worker", "team_member", 
  rw_df$job_qualification
) 
m12 <- brm(
  bf(ies_ts ~ job_qualification),
  family = skew_normal(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m12)
summary(m12)
me <- conditional_effects(
  m12, "job_qualification"
)
plot(me, points = FALSE)
emmeans(m12 , specs = pairwise ~ job_qualification)
m13 <- brm(
  bf(scs_ts ~ job_qualification * class),
  family = gaussian(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m13)
me <- conditional_effects(
  m13, "job_qualification:class"
)
plot(me, points = FALSE)
summary(m13)
emmeans(m13 , specs = pairwise ~ job_qualification*class)
m14 <- brm(
  bf(ptgi_total_score ~ ies_total_score | (1 | comme\)),
  family = gaussian(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
summary(m14)
bayes_R2(m14)
conditional_effects(m14, "is:class")

SEM

mydf <- data.frame(
  scs = scale(rw_df$scs_ts),
  class = ifelse(rw_df$class == 1, 0.0, 1.0),
  ptgi = scale(rw_df$ptgi_total_score),
  psc = scale(rw_df$sk + rw_df$ch + rw_df$mi),
  nsc = scale(rw_df$sj + rw_df$oi + rw_df$is),
  commettee = rw_df$red_cross_commeetee_location,
  id = 1:nrow(rw_df)
)

mydf <- mydf[complete.cases(mydf), ]
# Impute NAs with the mode.
# mydf$commettee[is.na(mydf$commettee)] <- "Comitato di Groane"
# summary(factor(mydf$commettee))
f1 <- bf(scs ~ class, family = skew_normal())
f2 <- bf(ptgi ~ scs + class, family = skew_normal())
mod <- brm(
  f1 + f2 + set_rescor(FALSE), 
  data = mydf, 
  cores = 4, 
  refresh = 0,
  init = 0.1,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
bayestestR::mediation(mod, mediator = "scs", ci = 0.95, method = "SPI")
pp_check(mod, resp = "ptgi")
pp_check(mod, resp = "scs")
summary(mod)
fit <- mlm(d = mydf, 
           id = "commettee",
           x = "class",
           m = "scs",
           y = "ptgi",
           iter = 2000, 
           cores = 4)
mlm_path_plot(fit, level = .95, text = T,
              xlab = "Resilience\nProfile",
              mlab = "Self\nCompassion",
              ylab = "PTG", digits = 2)

Causal Mediation Analysis for Stan Model

Treatment: class Mediator : scs Response : ptgi

Effect | Estimate | 95% SPI

Direct Effect (ADE) | -0.300 | [-0.464, -0.140] Indirect Effect (ACME) | 0.121 | [ 0.053, 0.187] Mediator Effect | 0.154 | [ 0.069, 0.230] Total Effect | -0.178 | [-0.325, -0.027]

m16 <- brm(
  bf(ptgi_total_score ~ class),
  family = skew_normal(),
  data = rw_df,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m16)
summary(m16)
bayes_R2(m16)
m17 <- brm(
  bf(ptgi_total_score ~ is_rescue_worker),
  family = skew_normal(),
  data = all_items,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
summary(m17)
rw_df$rate_of_activity_num <- as.integer(rw_df$rate_of_activity_num)
temp <- rw_df[1:746, ]

temp$activity <- cut(
  temp$rate_of_activity_num,
  breaks = c(-1, 0, 1, 2),    
  labels = c("Low", "Medium", "High"),   
  include.lowest = TRUE,    
  ordered_result = TRUE
)   
m19 <- brm(
  bf(activity ~ class),
  family=cumulative("logit"),
  data = temp,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
pp_check(m19)
summary(m19)
m20 <- brm(
  bf(class ~ last_training_num * scs_ts),
  family=bernoulli(),
  data = temp,
  backend = "cmdstanr",
  adapt_delta = 0.99
)
summary(m20)
conditional_effects(m20, "scs_ts:last_training_num")
table(rw_df$class, rw_df$last_training_num)
LS0tCnRpdGxlOiAiTFBBIGFuZCBTQyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeSgiaGVyZSIpCiAgbGlicmFyeSgidGlkeXZlcnNlIikKICBsaWJyYXJ5KCJNcGx1c0F1dG9tYXRpb24iKQogIGxpYnJhcnkoImd0IikKICBsaWJyYXJ5KCJnbHVlIikKICBsaWJyYXJ5KCJrYWJsZUV4dHJhIikKICBsaWJyYXJ5KCJtaXN0eSIpCiAgbGlicmFyeSgibGF2YWFuIikKICBsaWJyYXJ5KCJBSUNjbW9kYXZnIikKICBsaWJyYXJ5KCJub25uZXN0MiIpCiAgbGlicmFyeSgiRGlhZ3JhbW1lUiIpCiAgbGlicmFyeSgibGF2YWFuIikKICBsaWJyYXJ5KCJ0aWR5TFBBIikKICBsaWJyYXJ5KCJzZW1Ub29scyIpCiAgbGlicmFyeSgiYnJtcyIpCiAgbGlicmFyeSgiTUJFU1MiKQogIGxpYnJhcnkoInVmcyIpCiAgbGlicmFyeSgicm9ibWVkIikKICBsaWJyYXJ5KCJjYXJlbGVzcyIpCiAgbGlicmFyeSgibWljZSIpCiAgbGlicmFyeSgicHN5Y2giKQogIGxpYnJhcnkoIkJheWVzRmFjdG9yIikKICBsaWJyYXJ5KCJlZmZlY3RzaXplIikKICBsaWJyYXJ5KCJ0aWR5YmF5ZXMiKQogIGxpYnJhcnkoImVtbWVhbnMiKQogIGxpYnJhcnkoImJheWVzcGxvdCIpCiAgbGlicmFyeSgicGF0Y2h3b3JrIikKICBsaWJyYXJ5KCJibWxtIikKfSkKCiMgaW5zdGFsbC5wYWNrYWdlcygiY21kc3RhbnIiLCByZXBvcyA9IGMoImh0dHBzOi8vbWMtc3Rhbi5vcmcvci1wYWNrYWdlcy8iLCBnZXRPcHRpb24oInJlcG9zIikpKQoKCm9wdGlvbnMoIm1heC5wcmludCIgPSAuTWFjaGluZSRpbnRlZ2VyLm1heCkKCiMgTWFrZSByYW5kb20gdGhpbmdzIHJlcHJvZHVjaWJsZQpzZXQuc2VlZCgxMjM0KQoKb3B0aW9ucyhtYy5jb3JlcyA9IDQpCgpiYXllc3Bsb3RfdGhlbWVfc2V0KCkKYGBgCgpgYGB7cn0Kc291cmNlKGhlcmU6OmhlcmUoInNyYyIsICJmdW5jdGlvbnMiLCAiZnVuc19hZGRfbmVvZmZpNjBfc3Vic2NhbGVzLlIiKSkKc291cmNlKGhlcmU6OmhlcmUoInNyYyIsICJmdW5jdGlvbnMiLCAiZnVuc19jb3JyZWN0X2llc3Jfc2NvcmVzLlIiKSkKc291cmNlKGhlcmU6OmhlcmUoInNyYyIsICJmdW5jdGlvbnMiLCAiZnVuc19wbG90X2pvYl9xdWFsaWZpY2F0aW9uLlIiKSkKc291cmNlKGhlcmU6OmhlcmUoInNyYyIsICJmdW5jdGlvbnMiLCAiZnVuc19nZW5lcmF0ZV9hbGxfaXRlbXNfZGYuUiIpKQoKc2NhbGVfdGhpcyA8LSBmdW5jdGlvbih4KSBhcy52ZWN0b3Ioc2NhbGUoeCkpCgpzdW1fY29kaW5nIDwtIGZ1bmN0aW9uKHgsIGx2bHMgPSBsZXZlbHMoeCkpIHsKICAjIGNvZGVzIHRoZSBmaXJzdCBjYXRlZ29yeSB3aXRoIC0xCiAgbmx2bHMgPC0gbGVuZ3RoKGx2bHMpCiAgc3RvcGlmbm90KG5sdmxzID4gMSkKICBjb250IDwtIGRpYWcobmx2bHMpWywgLW5sdmxzLCBkcm9wID0gRkFMU0VdCiAgY29udFtubHZscywgXSA8LSAtMQogIGNvbnQgPC0gY29udFtjKG5sdmxzLCAxOihubHZscyAtIDEpKSwgLCBkcm9wID0gRkFMU0VdCiAgY29sbmFtZXMoY29udCkgPC0gbHZsc1stMV0KICB4IDwtIGZhY3Rvcih4LCBsZXZlbHMgPSBsdmxzKQogIGNvbnRyYXN0cyh4KSA8LSBjb250CiAgeAp9CmBgYAoKCiMgR2V0IGRhdGEKCmBgYHtyfQphbGxfaXRlbXMgPC0gZ2VuZXJhdGVfYWxsX2l0ZW1zX2RmKCkKYGBgCgpUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBJRVMtUiwgaW4gdGhlIGNvbnRyb2wgZ3JvdXAuIEkgc2hpZnQgdGhlIGNvbnRyb2wgZGlzdHJpYnV0aW9uIG9mIElFUy1SIHRvd2FyZHMgbG93ZXIgdmFsdWVzLgoKYGBge3J9CnRlbXAgPC0gY29ycmVjdF9pZXNyX3Njb3JlcyhhbGxfaXRlbXMpCmFsbF9pdGVtcyA8LSB0ZW1wCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoYWxsX2l0ZW1zLCBhZXMoeCA9IGllc3JfdHMsIGNvbG91ciA9IGlzX3Jlc2N1ZV93b3JrZXIpKSArCiAgZ2VvbV9kZW5zaXR5KCkKYGBgCgpgYGB7cn0KYWxsX2l0ZW1zIHw+IAogIGdncGxvdChhZXMoeT1pZXNyX3RzLCBmaWxsPWlzX3Jlc2N1ZV93b3JrZXIpKSArIAogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgc2NhbGVfeV9sb2cxMCgpCmBgYAoKCgpgYGB7cn0KYWxsX2l0ZW1zJHkgPC0gYWxsX2l0ZW1zJGllc3JfdHMgKyAwLjAwMQoKYWxsX2l0ZW1zIHw+IAogIGdyb3VwX2J5KGlzX3Jlc2N1ZV93b3JrZXIpIHw+IAogIHN1bW1hcml6ZSgKICAgICMgZ21faWVzciA9IGdlb21ldHJpYy5tZWFuKHksIG5hLnJtID0gVFJVRSksCiAgICBhdmdfaWVzciA9IG1lYW4oeSwgbmEucm0gPSBUUlVFKQogICkKYGBgCgpUaGVyZSBhcmUgc29tZSBjYXNlcyBpbiB3aGljaCB0aGUgUldzIG9mIFRvc2NhbmEgYW5kIExvbWJhcmRpYSBkaWQgbm90IGhhdmUgdGhlIHByb3BlciBxdWFsaWZpY2F0aW9uLiBUaGV5IGFyZSBhc3NpZ25lZCB0byB0aGUgY2F0ZWdvcnkgb2YgUldzLgoKYGBge3J9CmFsbF9pdGVtcyRpZHggPC0gMTpucm93KGFsbF9pdGVtcykKYWxsX2l0ZW1zJGlzX3Jlc2N1ZV93b3JrZXIgPC0gYXMuY2hhcmFjdGVyKGFsbF9pdGVtcyRpc19yZXNjdWVfd29ya2VyKQphbGxfaXRlbXMkaXNfcmVzY3VlX3dvcmtlciA8LSBpZmVsc2UoCiAgYWxsX2l0ZW1zJGlkeCA8IDc0NiwgIlNpIiwgYWxsX2l0ZW1zJGlzX3Jlc2N1ZV93b3JrZXIKKQphbGxfaXRlbXMkaWR4IDwtIE5VTEwKYGBgCgoKYGBge3J9CmFsbF9pdGVtcyRjb21tZWV0ZWVfbG9jYXRpb24gPC0gaWZlbHNlKAogIGFsbF9pdGVtcyRpc19yZXNjdWVfd29ya2VyID09ICJObyIsICJOb25lIiwgYWxsX2l0ZW1zJHJlZF9jcm9zc19jb21tZWV0ZWVfbG9jYXRpb24KKSB8PiAKICBmYWN0b3IoKQpgYGAKCmBgYHtyfQphbGxfaXRlbXMkY29tbWVldGVlX2xvY2F0aW9uIDwtIGlmZWxzZSgKICBhbGxfaXRlbXMkaXNfcmVzY3VlX3dvcmtlciA9PSAiTm8iICYgYWxsX2l0ZW1zJGFnZSA8IDI1LCAic3R1ZGVudHMiLCBhbGxfaXRlbXMkY29tbWVldGVlX2xvY2F0aW9uCikKYGBgCgpgYGB7cn0KYWxsX2l0ZW1zJGNvbW1lZXRlZSA8LSBpZmVsc2UoCiAgYWxsX2l0ZW1zJGlzX3Jlc2N1ZV93b3JrZXIgPT0gIk5vIiAmIGFsbF9pdGVtcyRhZ2UgPj0gMjUsICJjb21tdW5pdHlfc2FtcGxlIiwKICBhbGxfaXRlbXMkY29tbWVldGVlX2xvY2F0aW9uCikKCmFsbF9pdGVtcyRjb21tZWV0ZWUgPC0gCiAgaWZlbHNlKGlzLm5hKGFsbF9pdGVtcyRjb21tZWV0ZWUpLCAiY29tbXVuaXR5X3NhbXBsZSIsIGFsbF9pdGVtcyRjb21tZWV0ZWUpIHw+IAogIGZhY3RvcigpCgpzdW0oaXMubmEoYWxsX2l0ZW1zJGNvbW1lZXRlZSkpCmBgYAoKYGBge3J9CiMgYWxsX2l0ZW1zIDwtIGFsbF9pdGVtcyAlPiUKIyAgIG11dGF0ZShqb2JfcXVhbGlmaWNhdGlvbiA9IGNhc2Vfd2hlbigKIyAgICAgaXNfcmVzY3VlX3dvcmtlcj09IlNpIiAmIGpvYl9xdWFsaWZpY2F0aW9uID09ICJub25fcmVzY3VlX3dvcmtlciIgfiAidGVhbV9tZW1iZXIiLAojICAgICBUUlVFIH4gam9iX3F1YWxpZmljYXRpb24pKSAKYGBgCgoKIyMgSUVTLVIgYXMgYSBmdW5jdGlvbiBvZiBncm91cAoKaWVzcl90cyB8IHRydW5jKGxiID0gMCkgfiBpc19yZXNjdWVfd29ya2VyICsgKDEgfCBjb21tZWV0ZWUpLAoKYGBge3J9Cm0wIDwtIGJybSgKICBiZihpZXNyX3RzIH4gaXNfcmVzY3VlX3dvcmtlciksCiAgZmFtaWx5ID0gaHVyZGxlX2dhbW1hKCksCiAgZGF0YSA9IGFsbF9pdGVtcywKICBiYWNrZW5kID0gImNtZHN0YW5yIgogICMgYWxnb3JpdGhtID0gIm1lYW5maWVsZCIKKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtMCkKYGBgCgoKYGBge3J9CnN1bW1hcnkobTApCmBgYAoKYGBge3J9Cm1lIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoCiAgbTAsICJpc19yZXNjdWVfd29ya2VyIgopCnBsb3QobWUsIHBvaW50cyA9IEZBTFNFKQpgYGAKCmBgYHtyfQpCRnQgPC0gQmF5ZXNGYWN0b3I6OnR0ZXN0QkYoCiAgYWxsX2l0ZW1zJGllc190c1thbGxfaXRlbXMkaXNfcmVzY3VlX3dvcmtlciA9PSAiU2kiXSwgCiAgYWxsX2l0ZW1zJGllc190c1thbGxfaXRlbXMkaXNfcmVzY3VlX3dvcmtlciA9PSAiTm8iXSwKICBwYWlyZWQgPSBGQUxTRQopCmVmZmVjdHNpemUoQkZ0KQpgYGAKClN1cHBvcnRlZCBmYW1pbGllcyBhcmU6CidhY2F0JywgJ2FzeW1fbGFwbGFjZScsICdiZXJub3VsbGknLCAnYmV0YScsICdiZXRhX2Jpbm9taWFsJywgJ2Jpbm9taWFsJywgJ2NhdGVnb3JpY2FsJywgJ2NvbV9wb2lzc29uJywgJ2NveCcsICdjcmF0aW8nLCAnY3VtdWxhdGl2ZScsICdjdXN0b20nLCAnZGlyaWNobGV0JywgJ2RpcmljaGxldDInLCAnZGlzY3JldGVfd2VpYnVsbCcsICdleGdhdXNzaWFuJywgJ2V4cG9uZW50aWFsJywgJ2ZyZWNoZXQnLCAnZ2FtbWEnLCAnZ2F1c3NpYW4nLCAnZ2VuX2V4dHJlbWVfdmFsdWUnLCAnZ2VvbWV0cmljJywgJ2h1cmRsZV9jdW11bGF0aXZlJywgJ2h1cmRsZV9nYW1tYScsICdodXJkbGVfbG9nbm9ybWFsJywgJ2h1cmRsZV9uZWdiaW5vbWlhbCcsICdodXJkbGVfcG9pc3NvbicsICdpbmZvJywgJ2ludmVyc2UuZ2F1c3NpYW4nLCAnbG9naXN0aWNfbm9ybWFsJywgJ2xvZ25vcm1hbCcsICdtdWx0aW5vbWlhbCcsICduZWdiaW5vbWlhbCcsICduZWdiaW5vbWlhbDInLCAncG9pc3NvbicsICdzaGlmdGVkX2xvZ25vcm1hbCcsICdza2V3X25vcm1hbCcsICdzcmF0aW8nLCAnc3R1ZGVudCcsICd2b25fbWlzZXMnLCAnd2VpYnVsbCcsICd3aWVuZXInLCAnemVyb19pbmZsYXRlZF9hc3ltX2xhcGxhY2UnLCAnemVyb19pbmZsYXRlZF9iZXRhJywgJ3plcm9faW5mbGF0ZWRfYmV0YV9iaW5vbWlhbCcsICd6ZXJvX2luZmxhdGVkX2Jpbm9taWFsJywgJ3plcm9faW5mbGF0ZWRfbmVnYmlub21pYWwnLCAnemVyb19pbmZsYXRlZF9wb2lzc29uJywgJ3plcm9fb25lX2luZmxhdGVkX2JldGEnCgoKVGhlIHNrLCBjaCwgbWkgc3ViLXNjYWxlcyBhcmUgY29kZWQgc28gdGhhdCBoaWdoIHZhbHVlcyBpbmRpY2F0ZSBoaWdoIHNlbGYtY29tcGFzc2lvbiBsZXZlbHMuClRoZSBzaiwgaXMsIG9pIHN1Yi1zY2FsZXMgYXJlIGNvZGVkIHNvIHRoYXQgaGlnaCB2YWx1ZXMgaW5kaWNhdGUgbG93IHNlbGYtY29tcGFzc2lvbiBsZXZlbHMuCgpUaGUgdHNfc2Mgc2NvcmUgaGFzIGJlZW4gY29tcHV0ZWQgYnkgcmV2ZXJzaW5nIHRoZSBjb2Rpbmcgb2YgdGhlIGl0ZW1zIG9mIHRoZSBzaiwgaXMsIG9pIHN1Yi1zY2FsZXMgKHNvIHRoYXQgdGhleSBpbmRpY2F0ZSB0aGUgYWJzZW5jZSBvZiBzZWxmLWp1ZGdtZW50LCBhYnNlbmNlIG9mIGlzb2xhdGlvbiwgYWJzZW5jZSBvZiBvdmVyLWlkZW50aWZpY2F0aW9uKS4KCmBgYHtyfQpzY3Nfc3Vic2NhbGVzIDwtIHdpdGgoYWxsX2l0ZW1zLCBkYXRhLmZyYW1lKHNrLCBjaCwgbWksIHNqLCBpcywgb2ksIHNjc190cykpCmNvcihzY3Nfc3Vic2NhbGVzKSB8PiByb3VuZCgyKQpgYGAKCgojIyBDT1BFIHNjYWxlCgpJbiB0aGUgQ09QRSBzY2FsZSBvbmx5IHR3byBmYWN0b3JzIGFyZSBpZGVudGlmaWVkLgoKYGBge3J9CmFsbF9pdGVtcyRwb3NfcmVpbnRlcnByZXRhdGlvbiA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV8xICsgY29wZV8yOSArIGNvcGVfMzggKyBjb3BlXzU5KQphbGxfaXRlbXMkbWVudGFsX2Rpc2VuZ2FnZW1lbnQgPC0gd2l0aChhbGxfaXRlbXMsIGNvcGVfMiArIGNvcGVfMTYgKyBjb3BlXzMxICsgY29wZV80MykgCmFsbF9pdGVtcyR2ZW50aW5nIDwtIHdpdGgoYWxsX2l0ZW1zLCBjb3BlXzMgKyBjb3BlXzE3ICsgY29wZV8yOCArIGNvcGVfNDYpIAphbGxfaXRlbXMkc2Vla2luZ19pbnN0cnVtZW50YWxfc3VwcG9ydCA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV80ICsgY29wZV8xNCArIGNvcGVfMzAgKyBjb3BlXzQ1KSAKYWxsX2l0ZW1zJGFjdGl2ZV9jb3BpbmcgPC0gd2l0aChhbGxfaXRlbXMsIGNvcGVfNSArIGNvcGVfMjUgKyBjb3BlXzQ3ICsgY29wZV81OCkgIAphbGxfaXRlbXMkZGVuaWFsIDwtIHdpdGgoYWxsX2l0ZW1zLCBjb3BlXzYgKyBjb3BlXzI3ICsgY29wZV80MCArIGNvcGVfNTcpIAphbGxfaXRlbXMkcmVsaWdpb24gPC0gd2l0aChhbGxfaXRlbXMsIGNvcGVfNyArIGNvcGVfMTggKyBjb3BlXzQ4ICsgY29wZV82MCkgCmFsbF9pdGVtcyRodW1vciA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV84ICsgY29wZV8yMCArIGNvcGVfMzYgKyBjb3BlXzUwKSAKYWxsX2l0ZW1zJGJlaGF2aW9yYWxfZGlzZW5nYWdlbWVudCA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV85ICsgY29wZV8yNCArIGNvcGVfMzcgKyBjb3BlXzUxKSAKYWxsX2l0ZW1zJHJlc3RyYWludCA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV8xMCArIGNvcGVfMjIgKyBjb3BlXzQxICsgY29wZV80OSkgCmFsbF9pdGVtcyRzZWVraW5nX2Vtb3Rpb25hbF9zdXBwb3J0IDwtIHdpdGgoYWxsX2l0ZW1zLCBjb3BlXzExICsgY29wZV8yMyArIGNvcGVfMzQgKyBjb3BlXzUyKSAKYWxsX2l0ZW1zJHN1YnN0YW5jZV91c2UgPC0gd2l0aChhbGxfaXRlbXMsIGNvcGVfMTIgKyBjb3BlXzI2ICsgY29wZV8zNSArIGNvcGVfNTMpIAphbGxfaXRlbXMkYWNjZXB0YW5jZSA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV8xMyArIGNvcGVfMjEgKyBjb3BlXzQ0ICsgY29wZV81NCkgCmFsbF9pdGVtcyRzdXBwcl9jb21wZXRpbmdfYWN0aXZpdGllcyA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV8xNSArIGNvcGVfMzMgKyBjb3BlXzQyICsgY29wZV81NSkgCmFsbF9pdGVtcyRwbGFubmluZyA8LSB3aXRoKGFsbF9pdGVtcywgY29wZV8xOSArIGNvcGVfMzIgKyBjb3BlXzM5ICsgY29wZV81NikgCmBgYAoKQ3JlYXRlIENPUEUgc3ViLXNjYWxlcyBzY29yZXMgdXNpbmcgKmFsbCogaXRlbXMgLS0gbm90ZSB0aGF0IFNFTSBhbmFseXNlcyBzdWdnZXN0IAp0byBkcm9wIHNvbWUgb2YgdGhlIGl0ZW1zLgoKYGBge3J9CmFsbF9pdGVtcyRhY3RpdmVfY29waW5nIDwtIHdpdGgoCiAgYWxsX2l0ZW1zLCBwb3NfcmVpbnRlcnByZXRhdGlvbiArIGFjdGl2ZV9jb3BpbmcgKwogIHN1cHByX2NvbXBldGluZ19hY3Rpdml0aWVzICsgcGxhbm5pbmcgKyByZXN0cmFpbnQgKyAKICAgIHNlZWtpbmdfaW5zdHJ1bWVudGFsX3N1cHBvcnQgKyBhY2NlcHRhbmNlCikKCmFsbF9pdGVtcyRhdm9pZGFuY2VfY29waW5nIDwtIHdpdGgoCiAgYWxsX2l0ZW1zLCBtZW50YWxfZGlzZW5nYWdlbWVudCArIGRlbmlhbCArIGh1bW9yICsKICBiZWhhdmlvcmFsX2Rpc2VuZ2FnZW1lbnQgKyBzdWJzdGFuY2VfdXNlICsgcmVsaWdpb24gCikKCmFsbF9pdGVtcyRzb2NfZW1vX2NvcGluZyA8LSB3aXRoKAogIGFsbF9pdGVtcywgc2Vla2luZ19pbnN0cnVtZW50YWxfc3VwcG9ydCArCiAgc2Vla2luZ19lbW90aW9uYWxfc3VwcG9ydCArIHZlbnRpbmcKKQpgYGAKCgojIyBTZWxmLWNvbXBhc3Npb24gc2NhbGUKCgpgYGB7cn0KcGxvdChkZW5zaXR5KGFsbF9pdGVtcyRzY3NfdHMpKQpgYGAKCgpgYGB7cn0KZml0XzEgPC0gYnJtKAogIGJmKAogICAgc2NzX3RzIH4gaXNfcmVzY3VlX3dvcmtlciwKICAgIHNpZ21hIH4gaXNfcmVzY3VlX3dvcmtlcgogICAgKSwKICBmYW1pbHkgPSBzdHVkZW50KCksCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgZGF0YSA9IGFsbF9pdGVtcwopCmBgYAoKYGBge3J9CnBwX2NoZWNrKGZpdF8xKQpgYGAKCgpgYGB7cn0KbWUgPC0gY29uZGl0aW9uYWxfZWZmZWN0cygKICBmaXRfMSwgImlzX3Jlc2N1ZV93b3JrZXIiCikKcGxvdChtZSwgcG9pbnRzID0gRkFMU0UpCmBgYAoKYGBge3J9CnN1bW1hcnkoZml0XzEpCmBgYAoKYGBge3J9CkJGdCA8LSBCYXllc0ZhY3Rvcjo6dHRlc3RCRigKICBhbGxfaXRlbXMkc2NzX3RzW2FsbF9pdGVtcyRpc19yZXNjdWVfd29ya2VyID09ICJTaSJdLCAKICBhbGxfaXRlbXMkc2NzX3RzW2FsbF9pdGVtcyRpc19yZXNjdWVfd29ya2VyID09ICJObyJdLAogIHBhaXJlZCA9IEZBTFNFCikKZWZmZWN0c2l6ZShCRnQpCmBgYAoKYGBge3J9CnJ3X2RmIDwtIGFsbF9pdGVtcyB8PiAKICBkcGx5cjo6ZmlsdGVyKGlzX3Jlc2N1ZV93b3JrZXIgPT0gIlNpIikKCnJ3X2RmIDwtIHJ3X2RmICU+JQogIG11dGF0ZShqb2JfcXVhbGlmaWNhdGlvbiA9IGNhc2Vfd2hlbigKICAgIGpvYl9xdWFsaWZpY2F0aW9uID09ICJub25fcmVzY3VlX3dvcmtlciIgfiAidGVhbV9tZW1iZXIiLAogICAgVFJVRSB+IGpvYl9xdWFsaWZpY2F0aW9uKSkKYGBgCgoKIyMgTFBBCgpgYGB7cn0KbHBhX3NjYWxlcyA8LSBjKAogICJpc19yZXNjdWVfd29ya2VyIiwKICAibmV1cm90aWNpc20iLCAiZXh0cmF2ZXJzaW9uIiwgIm9wZW5uZXNzIiwgImFncmVlYWJsZW5lc3MiLCAiY29uc2NpZW50aW91c25lc3MiLAogICJhY3RpdmVfY29waW5nIiwgImF2b2lkYW5jZV9jb3BpbmciLCAic29jX2Vtb19jb3BpbmciLAogICJpZXNyX3RzIiwKICAjICJhdm9pZGluZyIsICJpbnRydXNpdml0eSIsICJoeXBlcmFyb3VzYWwiLAogICMgInNrIiwgImNoIiwgIm1pIiwgInNqIiwgImlzIiwgIm9pIiwKICAjICJwb3Nfc2MiLAogICMgIm5lZ19zYyIsCiAgIyAidHNfc2MiLAogICJtcHNzX3RvdCIKICAjICJwdGdpX3RvdGFsX3Njb3JlIgogICMgInJlbGF0aW5nX3RvX290aGVycyIsCiAgIyAibmV3X3Bvc3NpYmlsaXRpZXMiLAogICMgInBlcnNvbmFsX3N0cmVuZ3RoIiwKICAjICJhcHByZWNpYXRpb25fb2ZfbGlmZSIsCiAgIyAic3Bpcml0dWFsaXR5IgopCgpscGFfcndfZGYgPC0gc3Vic2V0KHJ3X2RmLCBzZWxlY3Q9bHBhX3NjYWxlcykgCgojIGxwYV9yd19kZiA8LSBzdWJzZXQoYWxsX2l0ZW1zLCBzZWxlY3Q9bHBhX3NjYWxlcykgfD4gCiMgICBkcGx5cjo6ZmlsdGVyKGlzX3Jlc2N1ZV93b3JrZXIgPT0gIlNpIikKCmxwYV9yd19kZiRpc19yZXNjdWVfd29ya2VyIDwtIE5VTEwKCmhlYWQobHBhX3J3X2RmKQpgYGAKCmBgYHtyfQpscGFfcndfZGYgJT4lIAogIHNjYWxlKCkgJT4lCiAgZXN0aW1hdGVfcHJvZmlsZXMoMTo2LAogICAgdmFyaWFuY2VzID0gYygiZXF1YWwiLCAidmFyeWluZyIpLAogICAgY292YXJpYW5jZXMgPSBjKCJ6ZXJvIiwgInZhcnlpbmciKQogICAgI3BhY2thZ2UgPSAiTXBsdXNBdXRvbWF0aW9uIgogICkKYGBgCgoKYGBge3J9CmxwYV9yd19kZiAlPiUgCiAgc2NhbGUoKSAlPiUKICBlc3RpbWF0ZV9wcm9maWxlcygxOjYsCiAgICB2YXJpYW5jZXMgPSBjKCJlcXVhbCIsICJ2YXJ5aW5nIiksCiAgICBjb3ZhcmlhbmNlcyA9IGMoInplcm8iLCAidmFyeWluZyIpCiAgICAjIHBhY2thZ2UgPSAiTXBsdXNBdXRvbWF0aW9uIgogICkgJT4lIAogIGNvbXBhcmVfc29sdXRpb25zKHN0YXRpc3RpY3MgPSBjKCJBSUMiLCAiQklDIikpCmBgYAoKCgpgYGB7cn0KbTIgPC0gbHBhX3J3X2RmICU+JQogIHNjYWxlKCkgJT4lCiAgZXN0aW1hdGVfcHJvZmlsZXMoMiwKICAgIHZhcmlhbmNlcyA9ICJ2YXJ5aW5nIiwKICAgIGNvdmFyaWFuY2VzID0gInZhcnlpbmciLAogICAgcGFja2FnZSA9ICJNcGx1c0F1dG9tYXRpb24iCiAgKQpgYGAKCgpgYGB7cn0KbTJfcGxvdCA8LSBscGFfcndfZGYgJT4lCiAgc2NhbGUoKSAlPiUKICBlc3RpbWF0ZV9wcm9maWxlcygyLAogICAgdmFyaWFuY2VzID0gInZhcnlpbmciLAogICAgY292YXJpYW5jZXMgPSAidmFyeWluZyIsCiAgICBwYWNrYWdlID0gIk1wbHVzQXV0b21hdGlvbiIKICAgICkgJT4lCiAgICBwbG90X3Byb2ZpbGVzKGFkZF9saW5lID0gVFJVRSwgcmF3ZGF0YT0gRkFMU0UsIGJ3ID0gRkFMU0UpCmBgYAoKUHJvZmlsZSAyOiBkeXNmdW5jdGlvbmFsClByb2ZpbGUgMTogYWRhcHRpdmUKCgpgYGB7cn0KZ2V0X2VzdGltYXRlcyhtMikKYGBgCgpgYGB7cn0Kb3V0IDwtIGdldF9kYXRhKG0yKQpscGFfcndfZGYkbHBhX2NsYXNzIDwtIG91dCRDbGFzcwpgYGAKCmBgYHtyfQp0YWJsZSgKICBscGFfcndfZGYkbHBhX2NsYXNzCikKYGBgCgoKYGBge3J9CnRhYmxlKAogIGxwYV9yd19kZiRscGFfY2xhc3MsIHJ3X2RmJGpvYl9xdWFsaWZpY2F0aW9uCikKYGBgCgoKYGBge3J9CmxwYV9yd19kZiRjbGFzcyA8LSBmYWN0b3IobHBhX3J3X2RmJGxwYV9jbGFzcykKc3VtbWFyeShscGFfcndfZGYkY2xhc3MpCmBgYAoKYGBge3J9CnJ3X2RmJGNsYXNzIDwtIGxwYV9yd19kZiRjbGFzcwpyd19kZiRwcm9maWxlIDwtIGxwYV9yd19kZiRjbGFzcwpyd19kZiRwcm9maWxlIDwtIGlmZWxzZSgKICByd19kZiRwcm9maWxlID09ICIyIiwgIm1hbGFkYXB0aXZlIiwgImFkYXB0aXZlIgopCnJ3X2RmJHByb2ZpbGUgPC0gZmFjdG9yKHJ3X2RmJHByb2ZpbGUpCiMgUmVvcmRlciB0aGUgbGV2ZWxzIG9mIHRoZSAncHJvZmlsZScgZmFjdG9yCnJ3X2RmJHByb2ZpbGUgPC0gZmFjdG9yKHJ3X2RmJHByb2ZpbGUsIGxldmVscyA9IGMoIm1hbGFkYXB0aXZlIiwgImFkYXB0aXZlIikpCmBgYAoKYGBge3J9Cm0xIDwtIGJybSgKICBiZihzY3NfdHMgfiBwcm9maWxlKSwKICBmYW1pbHkgPSBza2V3X25vcm1hbCgpLAogIGRhdGEgPSByd19kZiwKICBpbml0ID0gMC4xLAogIGJhY2tlbmQgPSAiY21kc3RhbnIiLAogIGFkYXB0X2RlbHRhID0gMC45CikKYGBgCgpgYGB7cn0KcHBfY2hlY2sobTEpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KG0xKQpgYGAKCmBgYHtyfQptZSA8LSBjb25kaXRpb25hbF9lZmZlY3RzKAogIG0xLCAicHJvZmlsZSIKKQpwbG90KG1lLCBwb2ludHMgPSBGQUxTRSkKYGBgCgpgYGB7cn0KQkZ0IDwtIEJheWVzRmFjdG9yOjp0dGVzdEJGKAogIHJ3X2RmJHNjc190c1tyd19kZiRjbGFzcyA9PSAxXSwgCiAgcndfZGYkc2NzX3RzW3J3X2RmJGNsYXNzID09IDJdLAogIHBhaXJlZCA9IEZBTFNFCikKZWZmZWN0c2l6ZShCRnQsIHR5cGUgPSAiZCIpCmBgYAoKYGBge3J9Cm0xICU+JQogIGVtbWVhbnMoIH4gcHJvZmlsZSkgJT4lCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm9maWxlLCB5ID0gLnZhbHVlKSkgKwogIGdlb21fZXllKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBOQSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJsaW5lIikgKwogICMgZmFjZXRfZ3JpZCh+IHdvb2wpICsKICAjIHRoZW1lX2xpZ2h0KCkKICBsYWJzKHggPSAiTFBBIENsYXNzIiwgeSA9ICJTQ1MgU2NvcmUiLCB0aXRsZSA9ICJSZXNjdWUgV29ya2VycyIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDgzLCBsYWJlbCA9ICJCYXllc2lhbiBDb2hlbidzIGQgPSAwLjg5XG4gOTUlIENJIFswLjczLCAxLjA0XSIpCmBgYAoKCgpgYGB7cn0KbmFtZXMoYWxsX2l0ZW1zKQpgYGAKCiMjIyBTZWxmLWp1ZGdtZW50CgpgYGB7cn0KbTIgPC0gYnJtKAogIGJmKHNqIH4gcHJvZmlsZSksCiAgZGF0YSA9IHJ3X2RmLAogIGZhbWlseSA9IHN0dWRlbnQsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgYWRhcHRfZGVsdGEgPSAwLjk5CikKYGBgCgpgYGB7cn0KcHBfY2hlY2sobTIpCmBgYAoKYGBge3J9Cmxvb19tMiA8LSBsb28obTIpCnBsb3QobG9vX20yKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeShtMikKYGBgCgoKYGBge3J9Cm1lIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoCiAgbTIsICJwcm9maWxlIgopCnBsb3QobWUsIHBvaW50cyA9IEZBTFNFKQpgYGAKCmBgYHtyfQplbW1lYW5zKG0yLCBzcGVjcyA9IHBhaXJ3aXNlIH4gcHJvZmlsZSkKYGBgCgpgYGB7cn0KQkZ0IDwtIEJheWVzRmFjdG9yOjp0dGVzdEJGKAogIHJ3X2RmJHNqW3J3X2RmJHByb2ZpbGUgPT0gImFkYXB0aXZlIl0sIAogIHJ3X2RmJHNqW3J3X2RmJHByb2ZpbGUgPT0gIm1hbGFkYXB0aXZlIl0sCiAgcGFpcmVkID0gRkFMU0UKKQplZmZlY3RzaXplKEJGdCkKYGBgCgoKYGBge3J9CnAyIDwtIG0yICU+JQogIGVtbWVhbnMoIH4gcHJvZmlsZSkgJT4lCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm9maWxlLCB5ID0gLnZhbHVlKSkgKwogIGdlb21fZXllKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBOQSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJsaW5lIikgKwogICMgZmFjZXRfZ3JpZCh+IHdvb2wpICsKICAjIHRoZW1lX2xpZ2h0KCkKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCdMb3cgUmVzaWxpZW5jZScsICdIaWdoIFJlc2lsaWVuY2UnKSkgKwogIGxhYnMoeCA9ICJMUEEgQ2xhc3MiLCB5ID0gIlNDUyBTZWxmLUp1ZGdtZW50IiwgdGl0bGUgPSAiQSIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDE0LjUsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDAuODJcbiA5NSUgQ0kgWzAuNjcsIDAuOTddIikKcDIKYGBgCgojIyMgSXNvbGF0aW9uCgpgYGB7cn0KbTMgPC0gYnJtKAogIGJmKGlzIH4gcHJvZmlsZSksCiAgZmFtaWx5ID0gc2tld19ub3JtYWwoKSwKICBkYXRhID0gcndfZGYsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgYWRhcHRfZGVsdGEgPSAwLjk1CikKYGBgCgpgYGB7cn0KcHBfY2hlY2sobTMpCmBgYAoKYGBge3J9Cmxvb19tMyA8LSBsb28obTMpCnBsb3QobG9vX20zKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeShtMykKYGBgCgoKYGBge3J9Cm1lIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoCiAgbTMsICJwcm9maWxlIgopCnBsb3QobWUsIHBvaW50cyA9IEZBTFNFKQpgYGAKCmBgYHtyfQplbW1lYW5zKG0zLCBzcGVjcyA9IHBhaXJ3aXNlIH4gcHJvZmlsZSkKYGBgCgpgYGB7cn0KQkZ0IDwtIEJheWVzRmFjdG9yOjp0dGVzdEJGKAogIHJ3X2RmJGlzW3J3X2RmJHByb2ZpbGUgPT0gImFkYXB0aXZlIl0sIAogIHJ3X2RmJGlzW3J3X2RmJHByb2ZpbGUgPT0gIm1hbGFkYXB0aXZlIl0sCiAgcGFpcmVkID0gRkFMU0UKKQplZmZlY3RzaXplKEJGdCkKYGBgCgpgYGB7cn0KcDMgPC0gbTMgJT4lCiAgZW1tZWFucyggfiBwcm9maWxlKSAlPiUKICBnYXRoZXJfZW1tZWFuc19kcmF3cygpICU+JQogIGdncGxvdChhZXMoeCA9IHByb2ZpbGUsIHkgPSAudmFsdWUpKSArCiAgZ2VvbV9leWUoKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IE5BKSwgZnVuLnkgPSBtZWFuLCBnZW9tID0gImxpbmUiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygnTG93IFJlc2lsaWVuY2UnLCAnSGlnaCBSZXNpbGllbmNlJykpICsKICBsYWJzKHggPSAiTFBBIENsYXNzIiwgeSA9ICJTQ1MgSXNvbGF0aW9uIiwgdGl0bGUgPSAiQiIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDEwLjIsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDAuOTRcbiA5NSUgQ0kgWzAuNzksIDEuMTBdIikKcDMKYGBgCgojIyMgT3Zlci1pZGVudGlmaWNhdGlvbgoKCmBgYHtyfQptNCA8LSBicm0oCiAgYmYob2kgfiBwcm9maWxlKSwKICBmYW1pbHkgPSBza2V3X25vcm1hbCgpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtNCkKYGBgCgpgYGB7cn0KbG9vX200IDwtIGxvbyhtNCkKcGxvdChsb29fbTQpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KG00KQpgYGAKCgpgYGB7cn0KbWUgPC0gY29uZGl0aW9uYWxfZWZmZWN0cygKICBtNCwgInByb2ZpbGUiCikKcGxvdChtZSwgcG9pbnRzID0gRkFMU0UpCmBgYAoKYGBge3J9CmVtbWVhbnMobTQsIHNwZWNzID0gcGFpcndpc2UgfiBwcm9maWxlKQpgYGAKCmBgYHtyfQpCRnQgPC0gQmF5ZXNGYWN0b3I6OnR0ZXN0QkYoCiAgcndfZGYkb2lbcndfZGYkcHJvZmlsZSA9PSAiYWRhcHRpdmUiXSwgCiAgcndfZGYkb2lbcndfZGYkcHJvZmlsZSA9PSAibWFsYWRhcHRpdmUiXSwKICBwYWlyZWQgPSBGQUxTRQopCmVmZmVjdHNpemUoQkZ0KQpgYGAKCmBgYHtyfQpwNCA8LSBtNCAlPiUKICBlbW1lYW5zKCB+IHByb2ZpbGUpICU+JQogIGdhdGhlcl9lbW1lYW5zX2RyYXdzKCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvZmlsZSwgeSA9IC52YWx1ZSkpICsKICBnZW9tX2V5ZSgpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gTkEpLCBmdW4ueSA9IG1lYW4sIGdlb20gPSAibGluZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCdMb3cgUmVzaWxpZW5jZScsICdIaWdoIFJlc2lsaWVuY2UnKSkgKwogIGxhYnMoeCA9ICJMUEEgQ2xhc3MiLCB5ID0gIlNDUyBPdmVyLUlkZW50aWZpY2F0aW9uIiwgdGl0bGUgPSAiQyIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDkuNCwgbGFiZWwgPSAiQmF5ZXNpYW4gQ29oZW4ncyBkID0gMC45N1xuIDk1JSBDSSBbMC44MiwgMS4xMl0iKQpwNApgYGAKCgojIyMgU2VsZi1raW5kbmVzcwoKYGBge3J9Cm01IDwtIGJybSgKICBiZihzayB+IHByb2ZpbGUpLAogIGZhbWlseSA9IHN0dWRlbnQoKSwKICBkYXRhID0gcndfZGYsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIKKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtNSkKYGBgCgpgYGB7cn0KbG9vX201IDwtIGxvbyhtNSkKcGxvdChsb29fbTUpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KG01KQpgYGAKCgpgYGB7cn0KbWUgPC0gY29uZGl0aW9uYWxfZWZmZWN0cygKICBtNSwgInByb2ZpbGUiCikKcGxvdChtZSwgcG9pbnRzID0gRkFMU0UpCmBgYAoKYGBge3J9CmVtbWVhbnMobTUsIHNwZWNzID0gcGFpcndpc2UgfiBwcm9maWxlKQpgYGAKCmBgYHtyfQpCRnQgPC0gQmF5ZXNGYWN0b3I6OnR0ZXN0QkYoCiAgcndfZGYkc2tbcndfZGYkcHJvZmlsZSA9PSAiYWRhcHRpdmUiXSwgCiAgcndfZGYkc2tbcndfZGYkcHJvZmlsZSA9PSAibWFsYWRhcHRpdmUiXSwKICBwYWlyZWQgPSBGQUxTRQopCmVmZmVjdHNpemUoQkZ0KQpgYGAKCmBgYHtyfQpwNSA8LSBtNSAlPiUKICBlbW1lYW5zKCB+IHByb2ZpbGUpICU+JQogIGdhdGhlcl9lbW1lYW5zX2RyYXdzKCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvZmlsZSwgeSA9IC52YWx1ZSkpICsKICBnZW9tX2V5ZSgpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gTkEpLCBmdW4ueSA9IG1lYW4sIGdlb20gPSAibGluZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCdMb3cgUmVzaWxpZW5jZScsICdIaWdoIFJlc2lsaWVuY2UnKSkgKwogIGxhYnMoeCA9ICJMUEEgQ2xhc3MiLCB5ID0gIlNDUyBTZWxmLUtpbmRuZXNzIiwgdGl0bGUgPSAiRCIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDE0LjUsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDAuMjhcbiA5NSUgQ0kgWzAuMTQsIDAuNDNdIikKcDUKYGBgCgojIyMgQ29tbW9uIGh1bWFuaXR5CgpgYGB7cn0KbTYgPC0gYnJtKAogIGJmKGNoIH4gcHJvZmlsZSksCiAgZmFtaWx5ID0gc3R1ZGVudCgpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIgopCmBgYAoKYGBge3J9CnBwX2NoZWNrKG02KQpgYGAKCmBgYHtyfQpsb29fbTYgPC0gbG9vKG02KQpwbG90KGxvb19tNikKYGBgCgoKYGBge3J9CnN1bW1hcnkobTYpCmBgYAoKCmBgYHtyfQptZSA8LSBjb25kaXRpb25hbF9lZmZlY3RzKAogIG02LCAicHJvZmlsZSIKKQpwbG90KG1lLCBwb2ludHMgPSBGQUxTRSkKYGBgCgpgYGB7cn0KQkZ0IDwtIEJheWVzRmFjdG9yOjp0dGVzdEJGKAogIHJ3X2RmJGNoW3J3X2RmJHByb2ZpbGUgPT0gImFkYXB0aXZlIl0sIAogIHJ3X2RmJGNoW3J3X2RmJHByb2ZpbGUgPT0gIm1hbGFkYXB0aXZlIl0sCiAgcGFpcmVkID0gRkFMU0UKKQplZmZlY3RzaXplKEJGdCkKYGBgCgoKYGBge3J9CnA2IDwtIG02ICU+JQogIGVtbWVhbnMoIH4gcHJvZmlsZSkgJT4lCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm9maWxlLCB5ID0gLnZhbHVlKSkgKwogIGdlb21fZXllKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBOQSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJsaW5lIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoJ0xvdyBSZXNpbGllbmNlJywgJ0hpZ2ggUmVzaWxpZW5jZScpKSArCiAgbGFicyh4ID0gIkxQQSBDbGFzcyIsIHkgPSAiU0NTIENvbW1vbi1IdW1hbml0eSIsIHRpdGxlID0gIkUiKSArCiAgcGFwYWphOjp0aGVtZV9hcGEoKSArIAogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEuNSwgeSA9IDEyLjIsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDAuMDBcbiA5NSUgQ0kgWy0wLjE0LCAwLjE0XSIpCnA2CmBgYAoKIyMjIE1pbmRmdWxuZXNzCgpgYGB7cn0KbTcgPC0gYnJtKAogIGJmKG1pIH4gcHJvZmlsZSksCiAgZmFtaWx5ID0gc3R1ZGVudCgpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIgopCmBgYAoKYGBge3J9CnBwX2NoZWNrKG03KQpgYGAKCmBgYHtyfQpsb29fbTcgPC0gbG9vKG03KQpwbG90KGxvb19tNykKYGBgCgoKYGBge3J9CnN1bW1hcnkobTcpCmBgYAoKYGBge3J9CmVtbWVhbnMobTcsIHNwZWNzID0gcGFpcndpc2UgfiBwcm9maWxlKQpgYGAKCmBgYHtyfQpCRnQgPC0gQmF5ZXNGYWN0b3I6OnR0ZXN0QkYoCiAgcndfZGYkbWlbcndfZGYkcHJvZmlsZSA9PSAiYWRhcHRpdmUiXSwgCiAgcndfZGYkbWlbcndfZGYkcHJvZmlsZSA9PSAibWFsYWRhcHRpdmUiXSwKICBwYWlyZWQgPSBGQUxTRQopCmVmZmVjdHNpemUoQkZ0KQpgYGAKCmBgYHtyfQptZSA8LSBjb25kaXRpb25hbF9lZmZlY3RzKAogIG03LCAicHJvZmlsZSIKKQpwbG90KG1lLCBwb2ludHMgPSBGQUxTRSkKYGBgCgoKYGBge3J9CnA3IDwtIG03ICU+JQogIGVtbWVhbnMoIH4gcHJvZmlsZSkgJT4lCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm9maWxlLCB5ID0gLnZhbHVlKSkgKwogIGdlb21fZXllKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBOQSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJsaW5lIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoJ0xvdyBSZXNpbGllbmNlJywgJ0hpZ2ggUmVzaWxpZW5jZScpKSArCiAgbGFicyh4ID0gIkxQQSBDbGFzcyIsIHkgPSAiU0NTIE1pbmRmdWxuZXNzIiwgdGl0bGUgPSAiRiIpICsKICBwYXBhamE6OnRoZW1lX2FwYSgpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDEzLjgsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDAuMzJcbiA5NSUgQ0kgWzAuMTcsIDAuNDZdIikKcDcKYGBgCgpgYGB7cn0KZmlnX3NjcyA8LSAocDIgfCBwMyB8IHA0KSAvCihwNSB8IHA2IHwgcDcpCgpvdXQgPC0gZmlnX3NjcyArIHBsb3RfYW5ub3RhdGlvbigKICB0aXRsZSA9ICdTQ1MgU3Vic2NhbGVzIGFzIGEgRnVuY3Rpb24gb2YgTFBBIFByb2ZpbGUnCiAgIyBzdWJ0aXRsZSA9ICdSZXNjdWUgV29ya2VycyBncm91cCcKICAjIGNhcHRpb24gPSAnRGlzY2xhaW1lcjogTm9uZSBvZiB0aGVzZSBwbG90cyBhcmUgaW5zaWdodGZ1bCcKKQpnZ3NhdmUoInNjc19zdWJzY2FsZXNfbHBhLnBkZiIsIHdpZHRoID0gMzUsIGhlaWdodCA9IDIwLCB1bml0cyA9ICJjbSIpCmBgYAoKYGBge3J9CnByaW50KG91dCkKYGBgCgoKCiMjIElFUy1SCgpgYGB7cn0KbTEwIDwtIGJybSgKICBiZihpZXNfdHMgfiBjbGFzcyksCiAgZmFtaWx5ID0gc2tld19ub3JtYWwoKSwKICBkYXRhID0gcndfZGYsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgYWRhcHRfZGVsdGEgPSAwLjk5CikKYGBgCgpgYGB7cn0KcHBfY2hlY2sobTEwKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG0xMCkKYGBgCgpgYGB7cn0KcDEwIDwtIG0xMCAlPiUKICBlbW1lYW5zKCB+IGNsYXNzKSAlPiUKICBnYXRoZXJfZW1tZWFuc19kcmF3cygpICU+JQogIGdncGxvdChhZXMoeCA9IGNsYXNzLCB5ID0gLnZhbHVlKSkgKwogIGdlb21fZXllKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBOQSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJsaW5lIikgKwogICMgZmFjZXRfZ3JpZCh+IHdvb2wpICsKICAjIHRoZW1lX2xpZ2h0KCkKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCdMb3cgUmVzaWxpZW5jZScsICdIaWdoIFJlc2lsaWVuY2UnKSkgKwogIGxhYnMoeCA9ICJMUEEgQ2xhc3MiLCB5ID0gIkltcGFjdCBvZiBFdmVudCBTY2FsZSAtIFJldmlzZWQgKElFUy1SKSIpICsKICAjIHBhcGFqYTo6dGhlbWVfYXBhKCkgKyAKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMTcsIGxhYmVsID0gIkJheWVzaWFuIENvaGVuJ3MgZCA9IDEuMzRcbiA5NSUgQ0kgWzEuMTgsIDEuNTBdIikKcDEwCmBgYAoKYGBge3J9CkJGdCA8LSBCYXllc0ZhY3Rvcjo6dHRlc3RCRigKICByd19kZiRpZXNfdHNbcndfZGYkY2xhc3MgPT0gMV0sIAogIHJ3X2RmJGllc190c1tyd19kZiRjbGFzcyA9PSAyXSwKICBwYWlyZWQgPSBGQUxTRQopCmVmZmVjdHNpemUoQkZ0KQpgYGAKCmBgYHtyfQplbW1lYW5zKG0xMCAsIHNwZWNzID0gcGFpcndpc2UgfiBjbGFzcykKYGBgCgoKYGBge3J9Cm0xMSA8LSBicm0oCiAgYmYocHRnaV90b3RhbF9zY29yZSB8IHRydW5jKGxiID0gMCkgfiBjbGFzcyksCiAgZmFtaWx5ID0gc3R1ZGVudCgpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIgopCmBgYAoKYGBge3J9CnBwX2NoZWNrKG0xMSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShtMTEpCmBgYAoKIyMjIEpvYiBxdWFsaWZpY2F0aW9uCgpgYGB7cn0KcndfZGYkam9iX3F1YWxpZmljYXRpb24gPC0gaWZlbHNlKAogIHJ3X2RmJGpvYl9xdWFsaWZpY2F0aW9uID09ICJub25fcmVzY3VlX3dvcmtlciIsICJ0ZWFtX21lbWJlciIsIAogIHJ3X2RmJGpvYl9xdWFsaWZpY2F0aW9uCikgCmBgYAoKCmBgYHtyfQptMTIgPC0gYnJtKAogIGJmKGllc190cyB+IGpvYl9xdWFsaWZpY2F0aW9uKSwKICBmYW1pbHkgPSBza2V3X25vcm1hbCgpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtMTIpCmBgYAoKYGBge3J9CnN1bW1hcnkobTEyKQpgYGAKCmBgYHtyfQptZSA8LSBjb25kaXRpb25hbF9lZmZlY3RzKAogIG0xMiwgImpvYl9xdWFsaWZpY2F0aW9uIgopCnBsb3QobWUsIHBvaW50cyA9IEZBTFNFKQpgYGAKCmBgYHtyfQplbW1lYW5zKG0xMiAsIHNwZWNzID0gcGFpcndpc2UgfiBqb2JfcXVhbGlmaWNhdGlvbikKYGBgCgpgYGB7cn0KbTEzIDwtIGJybSgKICBiZihzY3NfdHMgfiBqb2JfcXVhbGlmaWNhdGlvbiAqIGNsYXNzKSwKICBmYW1pbHkgPSBnYXVzc2lhbigpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtMTMpCmBgYAoKYGBge3J9Cm1lIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoCiAgbTEzLCAiam9iX3F1YWxpZmljYXRpb246Y2xhc3MiCikKcGxvdChtZSwgcG9pbnRzID0gRkFMU0UpCmBgYAoKYGBge3J9CnN1bW1hcnkobTEzKQpgYGAKCmBgYHtyfQplbW1lYW5zKG0xMyAsIHNwZWNzID0gcGFpcndpc2UgfiBqb2JfcXVhbGlmaWNhdGlvbipjbGFzcykKYGBgCgpgYGB7cn0KbTE0IDwtIGJybSgKICBiZihwdGdpX3RvdGFsX3Njb3JlIH4gaWVzX3RvdGFsX3Njb3JlIHwgKDEgfCBjb21tZVwpKSwKICBmYW1pbHkgPSBnYXVzc2lhbigpLAogIGRhdGEgPSByd19kZiwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG0xNCkKYGBgCmBgYHtyfQpiYXllc19SMihtMTQpCmBgYApgYGB7cn0KY29uZGl0aW9uYWxfZWZmZWN0cyhtMTQsICJpczpjbGFzcyIpCmBgYAoKCiMjIFNFTQoKYGBge3J9Cm15ZGYgPC0gZGF0YS5mcmFtZSgKICBzY3MgPSBzY2FsZShyd19kZiRzY3NfdHMpLAogIGNsYXNzID0gaWZlbHNlKHJ3X2RmJGNsYXNzID09IDEsIDAuMCwgMS4wKSwKICBwdGdpID0gc2NhbGUocndfZGYkcHRnaV90b3RhbF9zY29yZSksCiAgcHNjID0gc2NhbGUocndfZGYkc2sgKyByd19kZiRjaCArIHJ3X2RmJG1pKSwKICBuc2MgPSBzY2FsZShyd19kZiRzaiArIHJ3X2RmJG9pICsgcndfZGYkaXMpLAogIGNvbW1ldHRlZSA9IHJ3X2RmJHJlZF9jcm9zc19jb21tZWV0ZWVfbG9jYXRpb24sCiAgaWQgPSAxOm5yb3cocndfZGYpCikKCm15ZGYgPC0gbXlkZltjb21wbGV0ZS5jYXNlcyhteWRmKSwgXQpgYGAKCmBgYHtyfQojIEltcHV0ZSBOQXMgd2l0aCB0aGUgbW9kZS4KIyBteWRmJGNvbW1ldHRlZVtpcy5uYShteWRmJGNvbW1ldHRlZSldIDwtICJDb21pdGF0byBkaSBHcm9hbmUiCiMgc3VtbWFyeShmYWN0b3IobXlkZiRjb21tZXR0ZWUpKQpgYGAKCgpgYGB7cn0KZjEgPC0gYmYoc2NzIH4gY2xhc3MsIGZhbWlseSA9IHNrZXdfbm9ybWFsKCkpCmYyIDwtIGJmKHB0Z2kgfiBzY3MgKyBjbGFzcywgZmFtaWx5ID0gc2tld19ub3JtYWwoKSkKbW9kIDwtIGJybSgKICBmMSArIGYyICsgc2V0X3Jlc2NvcihGQUxTRSksIAogIGRhdGEgPSBteWRmLCAKICBjb3JlcyA9IDQsIAogIHJlZnJlc2ggPSAwLAogIGluaXQgPSAwLjEsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgYWRhcHRfZGVsdGEgPSAwLjk5CikKYGBgCgpgYGB7cn0KYmF5ZXN0ZXN0Ujo6bWVkaWF0aW9uKG1vZCwgbWVkaWF0b3IgPSAic2NzIiwgY2kgPSAwLjk1LCBtZXRob2QgPSAiU1BJIikKYGBgCgpgYGB7cn0KcHBfY2hlY2sobW9kLCByZXNwID0gInB0Z2kiKQpgYGAKCmBgYHtyfQpwcF9jaGVjayhtb2QsIHJlc3AgPSAic2NzIikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2QpCmBgYAoKYGBge3J9CmZpdCA8LSBtbG0oZCA9IG15ZGYsIAogICAgICAgICAgIGlkID0gImNvbW1ldHRlZSIsCiAgICAgICAgICAgeCA9ICJjbGFzcyIsCiAgICAgICAgICAgbSA9ICJzY3MiLAogICAgICAgICAgIHkgPSAicHRnaSIsCiAgICAgICAgICAgaXRlciA9IDIwMDAsIAogICAgICAgICAgIGNvcmVzID0gNCkKYGBgCgpgYGB7cn0KbWxtX3BhdGhfcGxvdChmaXQsIGxldmVsID0gLjk1LCB0ZXh0ID0gVCwKICAgICAgICAgICAgICB4bGFiID0gIlJlc2lsaWVuY2VcblByb2ZpbGUiLAogICAgICAgICAgICAgIG1sYWIgPSAiU2VsZlxuQ29tcGFzc2lvbiIsCiAgICAgICAgICAgICAgeWxhYiA9ICJQVEciLCBkaWdpdHMgPSAyKQpgYGAKCiMgQ2F1c2FsIE1lZGlhdGlvbiBBbmFseXNpcyBmb3IgU3RhbiBNb2RlbAoKICBUcmVhdG1lbnQ6IGNsYXNzCiAgTWVkaWF0b3IgOiBzY3MKICBSZXNwb25zZSA6IHB0Z2kKCkVmZmVjdCAgICAgICAgICAgICAgICAgfCBFc3RpbWF0ZSB8ICAgICAgICAgIDk1JSBTUEkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpEaXJlY3QgRWZmZWN0IChBREUpICAgIHwgICAtMC4zMDAgfCBbLTAuNDY0LCAtMC4xNDBdCkluZGlyZWN0IEVmZmVjdCAoQUNNRSkgfCAgICAwLjEyMSB8IFsgMC4wNTMsICAwLjE4N10KTWVkaWF0b3IgRWZmZWN0ICAgICAgICB8ICAgIDAuMTU0IHwgWyAwLjA2OSwgIDAuMjMwXQpUb3RhbCBFZmZlY3QgICAgICAgICAgIHwgICAtMC4xNzggfCBbLTAuMzI1LCAtMC4wMjddCgoKCgpgYGB7cn0KbTE2IDwtIGJybSgKICBiZihwdGdpX3RvdGFsX3Njb3JlIH4gY2xhc3MpLAogIGZhbWlseSA9IHNrZXdfbm9ybWFsKCksCiAgZGF0YSA9IHJ3X2RmLAogIGJhY2tlbmQgPSAiY21kc3RhbnIiLAogIGFkYXB0X2RlbHRhID0gMC45OQopCmBgYAoKYGBge3J9CnBwX2NoZWNrKG0xNikKYGBgCgoKYGBge3J9CnN1bW1hcnkobTE2KQpgYGAKCmBgYHtyfQpiYXllc19SMihtMTYpCmBgYAoKYGBge3J9Cm0xNyA8LSBicm0oCiAgYmYocHRnaV90b3RhbF9zY29yZSB+IGlzX3Jlc2N1ZV93b3JrZXIpLAogIGZhbWlseSA9IHNrZXdfbm9ybWFsKCksCiAgZGF0YSA9IGFsbF9pdGVtcywKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeShtMTcpCmBgYAoKYGBge3J9CnJ3X2RmJHJhdGVfb2ZfYWN0aXZpdHlfbnVtIDwtIGFzLmludGVnZXIocndfZGYkcmF0ZV9vZl9hY3Rpdml0eV9udW0pCmBgYAoKCmBgYHtyfQp0ZW1wIDwtIHJ3X2RmWzE6NzQ2LCBdCgp0ZW1wJGFjdGl2aXR5IDwtIGN1dCgKICB0ZW1wJHJhdGVfb2ZfYWN0aXZpdHlfbnVtLAogIGJyZWFrcyA9IGMoLTEsIDAsIDEsIDIpLCAgICAKICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSwgICAKICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsICAgIAogIG9yZGVyZWRfcmVzdWx0ID0gVFJVRQopICAgCmBgYAoKYGBge3J9Cm0xOSA8LSBicm0oCiAgYmYoYWN0aXZpdHkgfiBjbGFzcyksCiAgZmFtaWx5PWN1bXVsYXRpdmUoImxvZ2l0IiksCiAgZGF0YSA9IHRlbXAsCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgYWRhcHRfZGVsdGEgPSAwLjk5CikKYGBgCgoKYGBge3J9CnBwX2NoZWNrKG0xOSkKYGBgCgoKYGBge3J9CnN1bW1hcnkobTE5KQpgYGAKCmBgYHtyfQptMjAgPC0gYnJtKAogIGJmKGNsYXNzIH4gbGFzdF90cmFpbmluZ19udW0gKiBzY3NfdHMpLAogIGZhbWlseT1iZXJub3VsbGkoKSwKICBkYXRhID0gdGVtcCwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBhZGFwdF9kZWx0YSA9IDAuOTkKKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG0yMCkKYGBgCgpgYGB7cn0KY29uZGl0aW9uYWxfZWZmZWN0cyhtMjAsICJzY3NfdHM6bGFzdF90cmFpbmluZ19udW0iKQpgYGAKCgpgYGB7cn0KdGFibGUocndfZGYkY2xhc3MsIHJ3X2RmJGxhc3RfdHJhaW5pbmdfbnVtKQpgYGAKCg==